home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / Add-Ons / MPW / MPW re2c 1.1 / parser.cc < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-01  |  13.8 KB  |  508 lines  |  [TEXT/MPS ]

  1. #ifndef lint
  2. static char yysccsid[] = "@(#)yaccpar    1.8 (Berkeley) 01/20/90";
  3. #endif
  4. #define YYBYACC 1
  5. #line 2 "parser.y"
  6.  
  7. #include <time.h>
  8. #include <iostream.h>
  9. #include "globals.h"
  10. #include "parser.h"
  11. int yyparse();
  12. int yylex();
  13. void yyerror(char*);
  14.  
  15. static uint accept;
  16. static RegExp *spec;
  17. static Scanner *in;
  18.  
  19. #line 19 "parser.y"
  20. typedef union {
  21.     Symbol    *symbol;
  22.     RegExp    *regexp;
  23.     Token    *token;
  24.     char    op;
  25. } YYSTYPE;
  26. #line 27 "y.tab.c"
  27. #define CLOSE 257
  28. #define ID 258
  29. #define CODE 259
  30. #define RANGE 260
  31. #define STRING 261
  32. #define YYERRCODE 256
  33. short yylhs[] = {                                        -1,
  34.     0,    0,    0,    9,    2,    3,    3,    4,    4,    5,
  35.     5,    6,    6,    7,    7,    1,    1,    8,    8,    8,
  36.     8,
  37. };
  38. short yylen[] = {                                         2,
  39.     0,    2,    2,    4,    3,    0,    2,    1,    3,    1,
  40.     3,    1,    2,    1,    2,    1,    2,    1,    1,    1,
  41.     3,
  42. };
  43. short yydefred[] = {                                      1,
  44.     0,    0,   19,   20,    0,    2,    0,    0,    0,   12,
  45.     0,    3,    0,   18,    0,    0,    0,    0,    0,   13,
  46.    16,    0,    0,   21,    0,    0,    5,    0,   17,    4,
  47. };
  48. short yydgoto[] = {                                       1,
  49.    22,    6,   18,    7,    8,    9,   10,   11,   12,
  50. };
  51. short yysindex[] = {                                      0,
  52.   -27,  -49,    0,    0,  -23,    0,  -44,  -84,  -23,    0,
  53.  -243,    0,  -23,    0,  -39,  -23,  -23, -244,  -23,    0,
  54.     0, -239,  -53,    0, -104,  -84,    0,  -23,    0,    0,
  55. };
  56. short yyrindex[] = {                                      0,
  57.     0,  -31,    0,    0,    0,    0, -227,  -17,  -20,    0,
  58.   -40,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  59.     0,  -36,    0,    0, -226,  -16,    0,  -19,    0,    0,
  60. };
  61. short yygindex[] = {                                      0,
  62.     0,    0,    0,   21,   18,   17,    1,    0,    0,
  63. };
  64. #define YYTABLESIZE 243
  65. short yytable[] = {                                      14,
  66.    14,   24,   16,   15,   15,   30,   14,   19,   18,   20,
  67.    15,   13,    5,   21,   27,   18,    5,   29,   14,   17,
  68.    10,   11,   15,    8,    9,   15,   10,   11,   20,    8,
  69.     9,    6,    7,   23,   26,   28,   25,    0,   10,   11,
  70.     0,    8,    9,    0,    0,    0,    0,    0,    0,    0,
  71.     0,   14,    0,    0,    0,   15,    0,    0,    0,    0,
  72.    18,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  73.    17,   10,   11,    0,    0,    0,    0,    0,    0,   17,
  74.     0,    0,    0,   14,   17,    0,    0,   15,    0,    0,
  75.     0,    0,   18,    0,    0,    0,    0,    0,    0,    0,
  76.     0,    0,    0,   10,   11,    0,    8,    9,    0,    0,
  77.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  78.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  79.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  80.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  81.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  82.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  83.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  84.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  85.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  86.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  87.     0,    0,    0,    0,    0,    0,    0,   14,   14,   14,
  88.    14,   15,   15,   15,   15,   18,   18,   18,   18,   18,
  89.     2,    0,    3,    4,   14,    0,    3,    4,   10,   11,
  90.     0,    8,    9,
  91. };
  92. short yycheck[] = {                                      40,
  93.    41,   41,   47,   40,   41,   59,   47,   92,   40,    9,
  94.    47,   61,   40,  257,  259,   47,   40,  257,   59,  124,
  95.    41,   41,   59,   41,   41,    5,   47,   47,   28,   47,
  96.    47,  259,  259,   13,   17,   19,   16,   -1,   59,   59,
  97.    -1,   59,   59,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  98.    -1,   92,   -1,   -1,   -1,   92,   -1,   -1,   -1,   -1,
  99.    92,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  100.   124,   92,   92,   -1,   -1,   -1,   -1,   -1,   -1,  124,
  101.    -1,   -1,   -1,  124,  124,   -1,   -1,  124,   -1,   -1,
  102.    -1,   -1,  124,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  103.    -1,   -1,   -1,  124,  124,   -1,  124,  124,   -1,   -1,
  104.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  105.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  106.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  107.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  108.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  109.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  110.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  111.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  112.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  113.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  114.    -1,   -1,   -1,   -1,   -1,   -1,   -1,  258,  259,  260,
  115.   261,  258,  259,  260,  261,  257,  258,  259,  260,  261,
  116.   258,   -1,  260,  261,  258,   -1,  260,  261,  259,  259,
  117.    -1,  259,  259,
  118. };
  119. #define YYFINAL 1
  120. #ifndef YYDEBUG
  121. #define YYDEBUG 0
  122. #endif
  123. #define YYMAXTOKEN 261
  124. #if YYDEBUG
  125. char *yyname[] = {
  126. "end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  127. 0,0,0,0,0,0,"'('","')'",0,0,0,0,0,"'/'",0,0,0,0,0,0,0,0,0,0,0,"';'",0,"'='",0,0,
  128. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'\\\\'",0,0,0,0,0,0,0,
  129. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'|'",0,0,0,0,0,0,0,0,0,0,0,0,0,
  130. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  131. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  132. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  133. "CLOSE","ID","CODE","RANGE","STRING",
  134. };
  135. char *yyrule[] = {
  136. "$accept : spec",
  137. "spec :",
  138. "spec : spec rule",
  139. "spec : spec decl",
  140. "decl : ID '=' expr ';'",
  141. "rule : expr look CODE",
  142. "look :",
  143. "look : '/' expr",
  144. "expr : diff",
  145. "expr : expr '|' diff",
  146. "diff : term",
  147. "diff : diff '\\\\' term",
  148. "term : factor",
  149. "term : term factor",
  150. "factor : primary",
  151. "factor : primary close",
  152. "close : CLOSE",
  153. "close : close CLOSE",
  154. "primary : ID",
  155. "primary : RANGE",
  156. "primary : STRING",
  157. "primary : '(' expr ')'",
  158. };
  159. #endif
  160. #define yyclearin (yychar=(-1))
  161. #define yyerrok (yyerrflag=0)
  162. #ifdef YYSTACKSIZE
  163. #ifndef YYMAXDEPTH
  164. #define YYMAXDEPTH YYSTACKSIZE
  165. #endif
  166. #else
  167. #ifdef YYMAXDEPTH
  168. #define YYSTACKSIZE YYMAXDEPTH
  169. #else
  170. #define YYSTACKSIZE 500
  171. #define YYMAXDEPTH 500
  172. #endif
  173. #endif
  174. int yydebug;
  175. int yynerrs;
  176. int yyerrflag;
  177. int yychar;
  178. short *yyssp;
  179. YYSTYPE *yyvsp;
  180. YYSTYPE yyval;
  181. YYSTYPE yylval;
  182. short yyss[YYSTACKSIZE];
  183. YYSTYPE yyvs[YYSTACKSIZE];
  184. #define yystacksize YYSTACKSIZE
  185. #line 119 "parser.y"
  186.  
  187. void yyerror(char* s){
  188.     in->fatal(s);
  189. }
  190.  
  191. int yylex(){
  192.     return in->scan();
  193. }
  194.  
  195. void parse(int i, ostream &o){
  196.     o << "/* Generated by re2c on ";
  197.     time_t now = time(&now);
  198.     o.write(ctime(&now), 24);
  199.     o << " */\n";
  200.  
  201.     in = new Scanner(i);
  202.     o << "#line " << in->line() << " \"" << (fileName? fileName : "<stdin>") << "\"\n";
  203.  
  204.     while(in->echo(o)){
  205.     yyparse();
  206.     if(spec)
  207.         genCode(o, spec);
  208.     o << "#line " << in->line() << "\n";
  209.     }
  210. }
  211. #line 212 "y.tab.c"
  212. #define YYABORT goto yyabort
  213. #define YYACCEPT goto yyaccept
  214. #define YYERROR goto yyerrlab
  215. int
  216. yyparse()
  217. {
  218.     register int yym, yyn, yystate;
  219. #if YYDEBUG
  220.     register char *yys;
  221.     extern char *getenv();
  222.  
  223.     if (yys = getenv("YYDEBUG"))
  224.     {
  225.         yyn = *yys;
  226.         if (yyn >= '0' && yyn <= '9')
  227.             yydebug = yyn - '0';
  228.     }
  229. #endif
  230.  
  231.     yynerrs = 0;
  232.     yyerrflag = 0;
  233.     yychar = (-1);
  234.  
  235.     yyssp = yyss;
  236.     yyvsp = yyvs;
  237.     *yyssp = yystate = 0;
  238.  
  239. yyloop:
  240.     if (yyn = yydefred[yystate]) goto yyreduce;
  241.     if (yychar < 0)
  242.     {
  243.         if ((yychar = yylex()) < 0) yychar = 0;
  244. #if YYDEBUG
  245.         if (yydebug)
  246.         {
  247.             yys = 0;
  248.             if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
  249.             if (!yys) yys = "illegal-symbol";
  250.             printf("yydebug: state %d, reading %d (%s)\n", yystate,
  251.                     yychar, yys);
  252.         }
  253. #endif
  254.     }
  255.     if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
  256.             yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
  257.     {
  258. #if YYDEBUG
  259.         if (yydebug)
  260.             printf("yydebug: state %d, shifting to state %d\n",
  261.                     yystate, yytable[yyn]);
  262. #endif
  263.         if (yyssp >= yyss + yystacksize - 1)
  264.         {
  265.             goto yyoverflow;
  266.         }
  267.         *++yyssp = yystate = yytable[yyn];
  268.         *++yyvsp = yylval;
  269.         yychar = (-1);
  270.         if (yyerrflag > 0)  --yyerrflag;
  271.         goto yyloop;
  272.     }
  273.     if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
  274.             yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
  275.     {
  276.         yyn = yytable[yyn];
  277.         goto yyreduce;
  278.     }
  279.     if (yyerrflag) goto yyinrecovery;
  280. #ifdef lint
  281.     goto yynewerror;
  282. #endif
  283. yynewerror:
  284.     yyerror("syntax error");
  285. #ifdef lint
  286.     goto yyerrlab;
  287. #endif
  288. yyerrlab:
  289.     ++yynerrs;
  290. yyinrecovery:
  291.     if (yyerrflag < 3)
  292.     {
  293.         yyerrflag = 3;
  294.         for (;;)
  295.         {
  296.             if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&
  297.                     yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
  298.             {
  299. #if YYDEBUG
  300.                 if (yydebug)
  301.                     printf("yydebug: state %d, error recovery shifting\
  302.  to state %d\n", *yyssp, yytable[yyn]);
  303. #endif
  304.                 if (yyssp >= yyss + yystacksize - 1)
  305.                 {
  306.                     goto yyoverflow;
  307.                 }
  308.                 *++yyssp = yystate = yytable[yyn];
  309.                 *++yyvsp = yylval;
  310.                 goto yyloop;
  311.             }
  312.             else
  313.             {
  314. #if YYDEBUG
  315.                 if (yydebug)
  316.                     printf("yydebug: error recovery discarding state %d\n",
  317.                             *yyssp);
  318. #endif
  319.                 if (yyssp <= yyss) goto yyabort;
  320.                 --yyssp;
  321.                 --yyvsp;
  322.             }
  323.         }
  324.     }
  325.     else
  326.     {
  327.         if (yychar == 0) goto yyabort;
  328. #if YYDEBUG
  329.         if (yydebug)
  330.         {
  331.             yys = 0;
  332.             if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
  333.             if (!yys) yys = "illegal-symbol";
  334.             printf("yydebug: state %d, error recovery discards token %d (%s)\n",
  335.                     yystate, yychar, yys);
  336.         }
  337. #endif
  338.         yychar = (-1);
  339.         goto yyloop;
  340.     }
  341. yyreduce:
  342. #if YYDEBUG
  343.     if (yydebug)
  344.         printf("yydebug: state %d, reducing by rule %d (%s)\n",
  345.                 yystate, yyn, yyrule[yyn]);
  346. #endif
  347.     yym = yylen[yyn];
  348.     yyval = yyvsp[1-yym];
  349.     switch (yyn)
  350.     {
  351. case 1:
  352. #line 38 "parser.y"
  353. { accept = 0;
  354.           spec = NULL; }
  355. break;
  356. case 2:
  357. #line 41 "parser.y"
  358. { spec = spec? mkAlt(spec, yyvsp[0].regexp) : yyvsp[0].regexp; }
  359. break;
  360. case 4:
  361. #line 46 "parser.y"
  362. { if(yyvsp[-3].symbol->re)
  363.               in->fatal("sym already defined");
  364.           yyvsp[-3].symbol->re = yyvsp[-1].regexp; }
  365. break;
  366. case 5:
  367. #line 52 "parser.y"
  368. { yyval.regexp = new RuleOp(yyvsp[-2].regexp, yyvsp[-1].regexp, yyvsp[0].token, accept++); }
  369. break;
  370. case 6:
  371. #line 56 "parser.y"
  372. { yyval.regexp = new NullOp; }
  373. break;
  374. case 7:
  375. #line 58 "parser.y"
  376. { yyval.regexp = yyvsp[0].regexp; }
  377. break;
  378. case 8:
  379. #line 62 "parser.y"
  380. { yyval.regexp = yyvsp[0].regexp; }
  381. break;
  382. case 9:
  383. #line 64 "parser.y"
  384. { yyval.regexp =  mkAlt(yyvsp[-2].regexp, yyvsp[0].regexp); }
  385. break;
  386. case 10:
  387. #line 68 "parser.y"
  388. { yyval.regexp = yyvsp[0].regexp; }
  389. break;
  390. case 11:
  391. #line 70 "parser.y"
  392. { yyval.regexp =  mkDiff(yyvsp[-2].regexp, yyvsp[0].regexp);
  393.           if(!yyval.regexp)
  394.                in->fatal("can only difference char sets");
  395.         }
  396. break;
  397. case 12:
  398. #line 77 "parser.y"
  399. { yyval.regexp = yyvsp[0].regexp; }
  400. break;
  401. case 13:
  402. #line 79 "parser.y"
  403. { yyval.regexp = new CatOp(yyvsp[-1].regexp, yyvsp[0].regexp); }
  404. break;
  405. case 14:
  406. #line 83 "parser.y"
  407. { yyval.regexp = yyvsp[0].regexp; }
  408. break;
  409. case 15:
  410. #line 85 "parser.y"
  411. {
  412.             switch(yyvsp[0].op){
  413.             case '*':
  414.             yyval.regexp = mkAlt(new CloseOp(yyvsp[-1].regexp), new NullOp());
  415.             break;
  416.             case '+':
  417.             yyval.regexp = new CloseOp(yyvsp[-1].regexp);
  418.             break;
  419.             case '?':
  420.             yyval.regexp = mkAlt(yyvsp[-1].regexp, new NullOp());
  421.             break;
  422.             }
  423.         }
  424. break;
  425. case 16:
  426. #line 101 "parser.y"
  427. { yyval.op = yyvsp[0].op; }
  428. break;
  429. case 17:
  430. #line 103 "parser.y"
  431. { yyval.op = (yyvsp[-1].op == yyvsp[0].op) ? yyvsp[-1].op : '*'; }
  432. break;
  433. case 18:
  434. #line 107 "parser.y"
  435. { if(!yyvsp[0].symbol->re)
  436.               in->fatal("can't find symbol");
  437.           yyval.regexp = yyvsp[0].symbol->re; }
  438. break;
  439. case 19:
  440. #line 111 "parser.y"
  441. { yyval.regexp = yyvsp[0].regexp; }
  442. break;
  443. case 20:
  444. #line 113 "parser.y"
  445. { yyval.regexp = yyvsp[0].regexp; }
  446. break;
  447. case 21:
  448. #line 115 "parser.y"
  449. { yyval.regexp = yyvsp[-1].regexp; }
  450. break;
  451. #line 452 "y.tab.c"
  452.     }
  453.     yyssp -= yym;
  454.     yystate = *yyssp;
  455.     yyvsp -= yym;
  456.     yym = yylhs[yyn];
  457.     if (yystate == 0 && yym == 0)
  458.     {
  459. #if YYDEBUG
  460.         if (yydebug)
  461.             printf("yydebug: after reduction, shifting from state 0 to\
  462.  state %d\n", YYFINAL);
  463. #endif
  464.         yystate = YYFINAL;
  465.         *++yyssp = YYFINAL;
  466.         *++yyvsp = yyval;
  467.         if (yychar < 0)
  468.         {
  469.             if ((yychar = yylex()) < 0) yychar = 0;
  470. #if YYDEBUG
  471.             if (yydebug)
  472.             {
  473.                 yys = 0;
  474.                 if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
  475.                 if (!yys) yys = "illegal-symbol";
  476.                 printf("yydebug: state %d, reading %d (%s)\n",
  477.                         YYFINAL, yychar, yys);
  478.             }
  479. #endif
  480.         }
  481.         if (yychar == 0) goto yyaccept;
  482.         goto yyloop;
  483.     }
  484.     if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
  485.             yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
  486.         yystate = yytable[yyn];
  487.     else
  488.         yystate = yydgoto[yym];
  489. #if YYDEBUG
  490.     if (yydebug)
  491.         printf("yydebug: after reduction, shifting from state %d \
  492. to state %d\n", *yyssp, yystate);
  493. #endif
  494.     if (yyssp >= yyss + yystacksize - 1)
  495.     {
  496.         goto yyoverflow;
  497.     }
  498.     *++yyssp = yystate;
  499.     *++yyvsp = yyval;
  500.     goto yyloop;
  501. yyoverflow:
  502.     yyerror("yacc stack overflow");
  503. yyabort:
  504.     return (1);
  505. yyaccept:
  506.     return (0);
  507. }
  508.